package org.yelongframework.spring.web.method;

import java.lang.reflect.Method;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.method.HandlerMethod;
import org.yelongframework.commons.lang.annotation.AnnotationUtil;

/**
 * 默认处理器方法响应模式解析器
 * 
 * <pre>
 * 通过以下顺序解析响应的模式：
 * 处理器方法存在 {@link ResponseMode}注解，以该注解返回值来定义。
 * 处理器方法存在{@link ResponseBody}注解则是为WEB_BODY格式。
 * 处理器方法类上存在{@link ResponseBody}注解则是为WEB_BODY格式。
 * 响应结果为{@link ResponseEntity}则是为WEB_BODY格式。
 * 不满足以上任何条件则为WEB_PAGE格式。
 * </pre>
 * 
 * @since 1.0.0
 */
public class DefaultHandlerMethodResponseModeResolver implements HandlerMethodResponseModeResolver {

	@Override
	public HandlerMethodResponseMode resolve(HandlerMethod handlerMethod) {
		Method method = handlerMethod.getMethod();
		ResponseMode responseMode = AnnotationUtil.getAnnotation(method, ResponseMode.class);
		if (null != responseMode) {
			return responseMode.value();
		}
		if (method.isAnnotationPresent(ResponseBody.class)) {
			return HandlerMethodResponseMode.WEB_BODY;
		}
		Class<?> declaringClass = method.getDeclaringClass();
		if (declaringClass.isAnnotationPresent(ResponseBody.class)) {
			return HandlerMethodResponseMode.WEB_BODY;
		}
		if (declaringClass.isAnnotationPresent(RestController.class)) {
			return HandlerMethodResponseMode.WEB_BODY;
		}
		if (method.getReturnType() == ResponseEntity.class) {
			return HandlerMethodResponseMode.WEB_BODY;
		}
		return HandlerMethodResponseMode.WEB_PAGE;
	}

}
